﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

using SAP.Middleware.Connector;
using DECOR.DL.DALC;
using DECOR.BL.BE;
using CM.DL.DALC.NC03;
using CM.BL.BE;

namespace DECOR.DL.DALC.NC03
{
    public class DALC
    {
        public static string Username = "";
        public static string Password = "";
        public static string _Guid;
        

        public static RfcConfigParameters getConfigParam(RfcConfigParametersBE objConn)
        {
            string preFijo = ParametroDALC.getParamValueStatic("ConnType").ToLower();
            RfcConfigParameters rfcConfP = new RfcConfigParameters();

            rfcConfP.Add(RfcConfigParameters.Name, objConn.Id);
            rfcConfP.Add(RfcConfigParameters.SAPRouter, ParametroDALC.getParamValueStatic(preFijo + "Router"));
            rfcConfP.Add(RfcConfigParameters.AppServerHost, ParametroDALC.getParamValueStatic(preFijo + "Ashost"));
            rfcConfP.Add(RfcConfigParameters.SystemNumber, ParametroDALC.getParamValueStatic(preFijo + "Sysnr"));
            rfcConfP.Add(RfcConfigParameters.SystemID, ParametroDALC.getParamValueStatic(preFijo + "SystemID"));
            rfcConfP.Add(RfcConfigParameters.User, objConn.Uname);
            rfcConfP.Add(RfcConfigParameters.Password, objConn.Passwd);
            rfcConfP.Add(RfcConfigParameters.Client, ParametroDALC.getParamValueStatic(preFijo + "Client"));
            rfcConfP.Add(RfcConfigParameters.Language, "ES");
            rfcConfP.Add(RfcConfigParameters.MaxPoolSize, "10");
            //rfcConfP.Add(RfcConfigParameters.PeakConnectionsLimit, "20");
            rfcConfP.Add(RfcConfigParameters.PoolSize, "5");
            rfcConfP.Add(RfcConfigParameters.IdleTimeout, "600");
            rfcConfP.Add(RfcConfigParameters.NoCompression, "1");
            return rfcConfP;
        }

        public static string getConnectionId(RfcConfigParametersBE pObjConn)
        {
            string retval = string.Empty;
            RfcDestination dest; RfcConfigParameters cp;
            //InMemoryDestinationConfiguration dc = new InMemoryDestinationConfiguration();
            DestConfig dc = new DestConfig();
            try
            {
                cp = DALC.getConfigParam(pObjConn);
                try
                {
                    //RfcDestinationManager.UnregisterDestinationConfiguration(dc);
                    RfcDestinationManager.RegisterDestinationConfiguration(dc);
                }
                catch { }
                //UsuarioWebBE objU = new UsuarioWebBE();
                //objU.guid = pObjConn.Id;
                //objU.UsuarioSap = pObjConn.Uname;
                //objU.ClaveSap = pObjConn.Passwd;
                //CredencialesController.Usuario = objU;
                dc.AddOrEditDestination(cp);
                dest = RfcDestinationManager.GetDestination(CredencialesController.Usuario.Id);
                dest.Ping();
            }
            catch (Exception ex)
            {
                dc.RemoveDestination(pObjConn.Id);
                retval = ex.Message;
            }
            finally
            {
                RfcDestinationManager.UnregisterDestinationConfiguration(dc);
            }
            return retval;
        }

        //private static RfcConfigParameters createConnection()
        //{
        //    RfcConfigParameters rfcConfP = new RfcConfigParameters();
            
        //    return rfcConfP;
        //}

        //public static RfcConfigParameters getConnection
        //{
        //    get
        //    {
        //        return createConnection();
        //    }
        //}

        public static string logOut(string pConnId)
        {
            string retval = string.Empty;
            DestConfig dc = new DestConfig();
            //InMemoryDestinationConfiguration dc = new InMemoryDestinationConfiguration();
            try
            {
                try
                {
                    RfcDestinationManager.RegisterDestinationConfiguration(dc);
                }
                catch { }
                try//fix para la ejecución en la pantalla inicio cuando aún no se han logeado.
                {
                    RfcDestination dest = RfcDestinationManager.GetDestination(pConnId);
                    dest.Repository.ClearAllMetadata();
                    dest.Parameters.Clear();
                }
                catch { }
                dc.RemoveDestination(pConnId);
            }
            catch (Exception ex)
            {
                retval = ex.Message;
            }
            finally
            {
                RfcDestinationManager.UnregisterDestinationConfiguration(dc);
            }
            return retval;
        }

        /// <summary>
        /// Obtiene RfcDestination de CredencialesController; si no existe, crea uno nuevo y lo devuelve
        /// </summary>
        public static RfcDestination getDestination(out DestConfig _dc)
        {
            RfcConfigParameters rfcConfP = new RfcConfigParameters();
            RfcConfigParametersBE objConn = new RfcConfigParametersBE();
            DestConfig dc = new DestConfig();
            RfcDestination dest;
            IRfcFunction function = null;
            try
            {
                try
                {
                    RfcDestinationManager.RegisterDestinationConfiguration(dc);
                }
                catch { }
                dest = RfcDestinationManager.GetDestination(CredencialesController.Usuario.Id);
                dest.Ping();
            }
            catch (RfcInvalidParameterException ex)
            {
                try
                {
                    //--no se encontró el ID especificado, se debe abrir una nueva conexión
                    objConn.Uname = CredencialesController.Usuario.Uname;
                    objConn.Passwd = CredencialesController.Usuario.Passwd;
                    objConn.Id = CredencialesController.Usuario.Id;

                    rfcConfP = DALC.getConfigParam(objConn);
                    dc.AddOrEditDestination(rfcConfP);
                    //dc.RemoveDestination(RfcDestinationManager.DestinationMonitors[0].DestinationID);
                    
                    dest = RfcDestinationManager.GetDestination(CredencialesController.Usuario.Id);
                    dest.Ping();
                }
                catch (Exception ex2)
                {
                    dc.RemoveDestination(CredencialesController.Usuario.Id);
                    throw ex2;//lanza excepció para mostrar mensaje de error
                }
            }
            catch (Exception ex3)
            {
                dc.RemoveDestination(CredencialesController.Usuario.Id);
                throw ex3;//lanza excepció para mostrar mensaje de error
            }
            finally
            {
                _dc = dc;
                RfcDestinationManager.UnregisterDestinationConfiguration(dc);
            }
            return dest;
        }
    }
}
